/**
* @author Lourdes Sanchez
* @author Eugenia Jose
* @author Esteban Castro
* @author Carlos Fernandez
* @author Fernando Turon
* @version 1.0 01-05-12
*
* La clase PantallaPruebasLista se instancia en distintas parte de la aplicación
*
* @see Prueba, Ronda, InscripcionRonda
*/

package edu.uoc.tds.pec4.swingx;

import java.rmi.RemoteException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

import edu.uoc.tds.pec4.common.RemotoInterface;
import edu.uoc.tds.pec4.i18n.GestorIdiomas;
import edu.uoc.tds.pec4.model.Prueba;
import java.util.ArrayList;
import java.util.List;

//Fernando
public class PantallaPruebasLista extends javax.swing.JDialog {
    //Declaro las variables que se utilizarán a lo largo de la clase
    private PantallaPruebas pantallaPruebas;
    private RemotoInterface remoto;
    private boolean editable;

    private DefaultTableModel modeloTabla;
    private Object datosTabla[][];
    private Object nombresDeColumnaTabla[];

    private JTable jtablePruebas;
    private JScrollPane jScrollPanePruebas;

    //Constructor de la clase que recibe como parametros el formulario que lo llama y un booleano que indica el caracter modal o no del formulario
    public PantallaPruebasLista(PantallaPruebas pantallaPruebas, boolean modal) {
        //Asigno valores a las variables de clase
        this.pantallaPruebas = pantallaPruebas;
        this.remoto = pantallaPruebas.getRemoto();
        
        initComponents();
        myInitComponents();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jToolBarraHerramientas = new javax.swing.JToolBar();
        btnExit = new javax.swing.JButton();
        jPanelPruebas = new javax.swing.JPanel();
        jlblPrueba = new javax.swing.JLabel();
        jtxtId = new javax.swing.JTextField();
        jtxtDescripcion = new javax.swing.JTextField();
        jlblDescripcion = new javax.swing.JLabel();
        jbtnBuscar = new javax.swing.JButton();
        jbtnAceptar = new javax.swing.JButton();
        jmnuBarRondas = new javax.swing.JMenuBar();
        jmnuArchivo = new javax.swing.JMenu();
        jmnuSalir = new javax.swing.JMenuItem();
        jmnuAyuda = new javax.swing.JMenu();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle("eOlympics - Pruebas");

        jToolBarraHerramientas.setRollover(true);

        btnExit.setIcon(new javax.swing.ImageIcon(getClass().getResource("/icons/Exit.png"))); // NOI18N
        btnExit.setToolTipText("Salir");
        btnExit.setFocusable(false);
        btnExit.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        btnExit.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        btnExit.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnExitsalir(evt);
            }
        });
        jToolBarraHerramientas.add(btnExit);

        jlblPrueba.setText("Prueba");

        jtxtId.setHorizontalAlignment(javax.swing.JTextField.RIGHT);

        jtxtDescripcion.setHorizontalAlignment(javax.swing.JTextField.LEFT);

        jlblDescripcion.setText("Descripción");

        javax.swing.GroupLayout jPanelPruebasLayout = new javax.swing.GroupLayout(jPanelPruebas);
        jPanelPruebas.setLayout(jPanelPruebasLayout);
        jPanelPruebasLayout.setHorizontalGroup(
            jPanelPruebasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanelPruebasLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jlblPrueba)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jtxtId, javax.swing.GroupLayout.PREFERRED_SIZE, 62, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(24, 24, 24)
                .addComponent(jlblDescripcion)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jtxtDescripcion, javax.swing.GroupLayout.DEFAULT_SIZE, 300, Short.MAX_VALUE)
                .addContainerGap())
        );
        jPanelPruebasLayout.setVerticalGroup(
            jPanelPruebasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanelPruebasLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanelPruebasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jlblPrueba)
                    .addComponent(jtxtId, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jtxtDescripcion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jlblDescripcion))
                .addGap(392, 392, 392))
        );

        jbtnBuscar.setText("Buscar");
        jbtnBuscar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbtnBuscarActionPerformed(evt);
            }
        });

        jbtnAceptar.setText("Aceptar");
        jbtnAceptar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbtnAceptarActionPerformed(evt);
            }
        });

        jmnuArchivo.setText("Archivo");
        jmnuArchivo.setFont(new java.awt.Font("Tahoma", 1, 11));

        jmnuSalir.setText("Salir");
        jmnuSalir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jmnuSalirActionPerformed(evt);
            }
        });
        jmnuArchivo.add(jmnuSalir);

        jmnuBarRondas.add(jmnuArchivo);

        jmnuAyuda.setText("Ayuda");
        jmnuAyuda.setFont(new java.awt.Font("Tahoma", 1, 11));
        jmnuBarRondas.add(jmnuAyuda);

        setJMenuBar(jmnuBarRondas);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jToolBarraHerramientas, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(464, Short.MAX_VALUE))
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jbtnBuscar)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 352, Short.MAX_VALUE)
                .addComponent(jbtnAceptar)
                .addContainerGap())
            .addComponent(jPanelPruebas, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jToolBarraHerramientas, javax.swing.GroupLayout.PREFERRED_SIZE, 37, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jPanelPruebas, javax.swing.GroupLayout.PREFERRED_SIZE, 336, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jbtnBuscar)
                    .addComponent(jbtnAceptar))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    //Fernando
    //Evento asociado al boton salir
    private void btnExitsalir(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnExitsalir
        // TODO add your handling code here:
        this.setVisible(false);
}//GEN-LAST:event_btnExitsalir

    //Fernando
    //Evento asociado al boton aceptar que se posiciona en una prueba determinada
    private void jbtnAceptarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtnAceptarActionPerformed
        // TODO add your handling code here:
        this.mostrarPrueba();
}//GEN-LAST:event_jbtnAceptarActionPerformed
    //Fernando
    //Evento asociado al botón buscar. Actualiza el formulario conforme a los criterios seleccionados
    private void jbtnBuscarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtnBuscarActionPerformed
        // TODO add your handling code here:
        this.actualizarDatosTabla();
}//GEN-LAST:event_jbtnBuscarActionPerformed

    private void jmnuSalirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmnuSalirActionPerformed
        // TODO add your handling code here:
        this.setVisible(false);
    }//GEN-LAST:event_jmnuSalirActionPerformed

    //Actualiza los datos de la tabla del formulario
    private void actualizarDatosTabla(){
        this.limpiarTabla();
        this.rellenarTablePruebas();
    }

    /**
     * Metodo para crear y definir un objeto tipo jtable, asignando sus propiedades fundamentales
     * {pre: la clase ha de estar instanciada previamente y el objeto definido}
     * {post: establece los nombres de columna y el modeloTabla predeterminado}
     */
    private void crearTabla(){
        try{
            this.datosTabla = new Object [][]{};

            //Variables para asignar texto a la cabecera de la tabla
            String textoCabecera1;
            String textoCabecera2;
            textoCabecera1 = GestorIdiomas.getMessage("pantallaPruebasLista.TextoCabecera1");
            textoCabecera2 = GestorIdiomas.getMessage("pantallaPruebasLista.TextoCabecera2");

            this.nombresDeColumnaTabla = new String []{textoCabecera1, textoCabecera1};

            this.modeloTabla = new DefaultTableModel(this.datosTabla,this.nombresDeColumnaTabla);

            this.jtablePruebas.setModel(this.modeloTabla);
            this.jScrollPanePruebas.setViewportView(this.jtablePruebas);
            
            //COlocamos la tabla en la posición definida
            javax.swing.GroupLayout jPanelTablaLayout = new javax.swing.GroupLayout(jPanelPruebas);
            jPanelPruebas.setLayout(jPanelTablaLayout);
            jPanelTablaLayout.setHorizontalGroup(
                jPanelTablaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(jPanelTablaLayout.createSequentialGroup()
                    .addContainerGap()
                    .addComponent(jScrollPanePruebas, javax.swing.GroupLayout.DEFAULT_SIZE, 466, Short.MAX_VALUE)
                    .addContainerGap())
            );

            jPanelTablaLayout.setVerticalGroup(
                jPanelTablaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanelTablaLayout.createSequentialGroup()
                .addGap(50, 50, 50)
                .addComponent(jScrollPanePruebas, javax.swing.GroupLayout.PREFERRED_SIZE, 197, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
            );
        }

        /** Capturamos excepcion de caracter general*/
        catch (Exception exc) {
            JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("error.general"), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
        }
    }

    /**
     * Metodo para inicializar los componentes contenidos y asociados a un objeto jtable
     * {pre: el objeto jtable ha de estar creado
     * {post: permite que el objeto este disponible para mostrar nuevos datos
     */
    private void limpiarTabla(){
        for(int fila = this.modeloTabla.getRowCount()-1; fila >= 0; fila--){
            this.modeloTabla.removeRow(fila);
        }
    }

    /**
     * Metodo para rellenar los resultados de la participacion en un jtable sin diferenciar por universidad
     * {pre: la clase ha de estar instanciada previamente y el objeto definido}
     * {post: establece contenidos, la valoracion, de las celdas, informando del nÃºmero de respuestas por cada tipo de pregunta/respuesta}
     */
    public void rellenarTablePruebas(){
        //Declaramos una variable que servirá para mostrar la informacion
        Prueba pruebaParametro = new Prueba();
        int idPrueba = 0;
        String descripcionPrueba = "";
        pruebaParametro.setId_prueba(idPrueba);
        pruebaParametro.setDescripcion_prueba(descripcionPrueba);

        //Asignamos el valor del identificador de la prueba que se pasara por parametro
        // para filtrar la busqueda en la BBDD
        if(this.jtxtId.getText().isEmpty())
            pruebaParametro.setId_prueba(0);

        else{
            idPrueba = Integer.parseInt(this.jtxtId.getText());
            pruebaParametro.setId_prueba(idPrueba);
        }

        //Asignamos el valor de la descripción de la prueba
        if(this.jtxtDescripcion.getText().isEmpty())
            pruebaParametro.setDescripcion_prueba(null);
        
        else{
            descripcionPrueba = this.jtxtDescripcion.getText();
            pruebaParametro.setDescripcion_prueba(descripcionPrueba);
        }

        List<Prueba> lista = new ArrayList<Prueba>();

        //Mediante un bucle iremos rellenando la informacion de la tabla en base a los datos pasados
        //  por parametro
        try{
            lista = this.remoto.getListaPruebas(pruebaParametro);
            for(Prueba prueba: lista){
                int id_Prueba = prueba.getId_prueba();
                String descripcion_Prueba = prueba.getDescripcion_prueba();

                this.modeloTabla.addRow(new Object[]{id_Prueba, descripcion_Prueba});
            }
        }

        /** Capturamos excepcion asociada al servidor remoto*/
        catch (RemoteException exc) {
            exc.printStackTrace();
            JOptionPane.showMessageDialog(null, exc.detail, GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
        }

        /** Capturamos excepcion de caracter general*/
        catch (Exception exc) {
            exc.printStackTrace();
            JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("pantallaPruebasLista.errorgeneral"), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
        }
    }

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                PantallaPruebas dialog = null;
                try {
                    dialog = new PantallaPruebas(new PantallaMenuPrincipal(), true);
                }

                catch (RemoteException ex) {
                    Logger.getLogger(PantallaPruebasLista.class.getName()).log(Level.SEVERE, null, ex);
                }

                dialog.addWindowListener(new java.awt.event.WindowAdapter() {
                    public void windowClosing(java.awt.event.WindowEvent e) {
                        System.exit(0);
                    }
                });
                dialog.setVisible(true);
            }
        });
    }

    //Fernando
    //Metodo que utilizo para mostrar en el formulario PantallaPruebas el registro seleccionado
    private void mostrarPrueba(){
        int id_prueba = 0;
        int fila = 0;

        //En el caso de error lanzaremos la excepcion
        try {
            fila = this.jtablePruebas.getSelectedRow();
            id_prueba = (Integer) this.jtablePruebas.getValueAt(fila,0);

            //Mostramos el registro seleccionado
            this.pantallaPruebas.mostrarPrueba(id_prueba);
            //Ocultamos este formulario
            this.setVisible(false);
        }

        //En el caso en que el valor del idprueba este fuera de rango
        catch(ArrayIndexOutOfBoundsException exc){
            exc.printStackTrace();
            JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("pantallaPruebasLista.ElijaUnaPrueba"), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
        }

        //Si la excepcion capturada tiene que ver con el servidor remoto
        catch (RemoteException exc) {
            exc.printStackTrace();
            JOptionPane.showMessageDialog(null, exc.detail, GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
        }

        //Para cualquier otra excepcion de caracter general
        catch (Exception exc) {
            exc.printStackTrace();
            JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("pantallaPruebasLista.errorgeneral"), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
        }
    }

    //Fernando
    //Metodo para limpiar los valores de los controles referidos a la busqueda
    private void limpiarPantalla(){
        this.jtxtId.setText(null);
        this.jtxtDescripcion.setText(null);
    }

    //Fernando
    //Metodo para inicializar y asignar valores a los controles que se muestran por paantalla
    private void myInitComponents(){
        this.jScrollPanePruebas = new JScrollPane();
        this.jtablePruebas = new JTable();

        this.jPanelPruebas.add(this.jScrollPanePruebas);

        this.crearTabla();
        this.limpiarTabla();

        //Asignamos textos en función del Getsor de Idiomas
        this.jmnuArchivo.setText(GestorIdiomas.getMessage("pantallaPruebasLista.MenuArchivo"));
        this.jmnuSalir.setText(GestorIdiomas.getMessage("pantallaPruebasLista.MenuSalir"));
        this.jbtnAceptar.setText(GestorIdiomas.getMessage("pantallaPruebasLista.BotonAceptar"));
        this.jbtnBuscar.setText(GestorIdiomas.getMessage("pantallaPruebasLista.BotonBuscar"));
        this.jlblPrueba.setText(GestorIdiomas.getMessage("pantallaPruebasLista.EtiquetaPrueba"));
        this.jlblDescripcion.setText(GestorIdiomas.getMessage("pantallaPruebasLista.EtiquetaDescripcion"));

        this.btnExit.setToolTipText(GestorIdiomas.getMessage("btnExit.tooltiptext"));
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnExit;
    private javax.swing.JPanel jPanelPruebas;
    private javax.swing.JToolBar jToolBarraHerramientas;
    private javax.swing.JButton jbtnAceptar;
    private javax.swing.JButton jbtnBuscar;
    private javax.swing.JLabel jlblDescripcion;
    private javax.swing.JLabel jlblPrueba;
    private javax.swing.JMenu jmnuArchivo;
    private javax.swing.JMenu jmnuAyuda;
    private javax.swing.JMenuBar jmnuBarRondas;
    private javax.swing.JMenuItem jmnuSalir;
    private javax.swing.JTextField jtxtDescripcion;
    private javax.swing.JTextField jtxtId;
    // End of variables declaration//GEN-END:variables

}
